"-----------------------------set vim base-----------------------
" Setting some decent VIM settings for programming

set nocompatible
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on

" set term=ansi
set ai                                  " set auto-indenting on for programming
set showmatch                           " automatically show matching brackets. works like it does in bbedit.
set vb                                  " turn on the
set ruler                               " show the cursor position all the time
set laststatus=2                        " make the last line where the status is two lines deep so you can see status always
set backspace=indent,eol,start          " make that backspace key work the way it should
set background=dark                     " use colours that work well on a dark background (console is usually black)
syntax on                               " turn syntax highlighting on by default
set nu                                  " 显示行号
set nobackup                            " 不要备分
set nowb                                " 不备分
set noswapfile                          " 不要交换文件
set mouse=a                             " 鼠标可用
set smartindent                         " 自动缩进
set hlsearch                            " 高亮匹配
set magic                               " 反斜杠有特殊意义
set wildmenu                            " 命令zsh模式
set wildmode=full                       " 命令zsh
set clipboard+=unnamed                  " vim 寄存器与系统剪贴板共享
set fdm=syntax                          " 根据语法折叠
set fdm=expr                            " 手动折叠
set foldmethod=indent                   " 打开缩进折叠
set foldlevel=3                         " 缩进折叠级别
set fileencodings=utf-8,chinese,latin-1 " 设置中文编码
set dy=lastline                         " 显示最多行，不用@@
set sw=4                                " 缩进空格4个
set ts=4                                " 制表符替换成4个空格
set smarttab                            " 缩进首行也是4个空格

set cursorline
set relativenumber
set encoding=utf-8
language messages zh_CN.utf-8           " 解决 CONSLE 输出乱码
au FileType vim setlocal foldmethod=marker "vim 文件折叠方式为 marker

let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

"------------------------------ 键盘映射 --------------------------------

"nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR> "设置键盘映射，通过空格设置折叠
let mapleader=" "

noremap h i
noremap H I

noremap j h
noremap k j
noremap i k
noremap I 5k
noremap J 5h
noremap L 5l

xnoremap < <gv
xnoremap > >gv

function! Init()
	noremap K 5j
endfunction

nnoremap W :source $MYVIMRC<CR>:call Init()<CR>

map <up> :res +5<CR>
map <down> :res -5<CR>
map <left> :vertical resize-5<CR>
map <right> :vertical resize+5<CR>


noremap s <nop>
nnoremap U <C-r>

map <leader>tN :tabnew<cr>
map <leader>tc :tabclose<cr>
map <leader>tn :tabn<cr>
map <leader>tl :tabp<cr>


function! MarkWindowSwap()
    let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe g:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf 
endfunction

noremap <silent> <leader>1 :call MarkWindowSwap()<CR>
noremap <silent> <leader>2 :call DoWindowSwap()<CR>

" 取消选中
map <leader><cr> :noh<cr>

" 快捷保存
nnoremap S :w<cr>

""转换当前行为大写
inoremap qq <esc>
vnoremap qq <esc>

nnoremap <F2> :setlocal number!<cr>

vnoremap <C-c>             "+y
imap <C-V>                 "+gP
map <S-Insert>             "+gP
cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

" 窗口切换
nnoremap <C-i> <C-W>k
nnoremap <C-j> <C-W>h
nnoremap <C-k> <C-W>j
nnoremap <C-l> <C-W>l

" v模式下快速搜索
nnoremap ff yiw/<c-r>0<cr>


" 使用 Alt 移动
execute "set <A-i>=\ei"
execute "set <A-k>=\ek"
nnoremap <A-k> :m .+1<CR>==
nnoremap <A-i> :m .-2<CR>==
inoremap <A-k> <Esc>:m .+1<CR>==gi
inoremap <A-i> <Esc>:m .-2<CR>==gi
vnoremap <A-i> :m '<-2<CR>gv=gv
vnoremap <A-k> :m '>+1<CR>gv=gv

"______________________________plug插件_______________________________________

call plug#begin()

Plug 'preservim/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'

" Use release branch (recommend)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

"快速注释
Plug 'preservim/nerdcommenter'

Plug 'dense-analysis/ale'

Plug 'luochen1990/rainbow'
Plug 'tomasiser/vim-code-dark'

Plug '~/.fzf'
Plug 'junegunn/fzf.vim'

Plug '~/.vim/plugged/vim-visual-multi'

Plug '~/.vim/plugged/vim-surround'

Plug '~/.vim/plugged/vim-repeat'

call plug#end()

let g:rainbow_active = 1 "set to 0 if you want to enable it later via :RainbowToggle
colorscheme codedark

"________________ nerdtree setttings_________________

" Start NERDTree and leave the cursor in it.
autocmd VimEnter * NERDTree

nnoremap <leader>nf :NERDTreeFind 
nnoremap <leader>n :NERDTreeToggle<CR>

let NERDTreeMapOpenSplit='s'
let NERDTreeMapOpenSplit='vs'
let NERDTreeMenuUp='i'
let NERDTreeShowBookmarks=1

let NERDTreeMapToggleHidden=''
let NERDTreeMapJumpFirstChild=''

"________________ coc setttings_________________

" Set internal encoding of vim, not needed on neovim, since coc.nvim using some
" unicode characters in the file autoload/float.vim
set encoding=utf-8

" TextEdit might fail if hidden is not set.
set hidden

" Some servers have issues with backup files, see #649.
set nobackup
set nowritebackup

" Give more space for displaying messages.
set cmdheight=2

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300

" Don't pass messages to |ins-completion-menu|.
set shortmess+=c

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
if has("nvim-0.5.0") || has("patch-8.1.1564")
  " Recently vim can merge signcolumn and number column into one
  set signcolumn=number
else
  set signcolumn=yes
endif

" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

" Use <c-space> to trigger completion.
if has('nvim')
  inoremap <silent><expr> <c-space> coc#refresh()
else
  inoremap <silent><expr> <c-@> coc#refresh()
endif

" Make <CR> auto-select the first completion item and notify coc.nvim to
" format on enter, <cr> could be remapped by other vim plugin
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  elseif (coc#rpc#ready())
    call CocActionAsync('doHover')
  else
    execute '!' . &keywordprg . " " . expand('<cword>')
  endif
endfunction

" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')

" Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)

" Formatting selected code.
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)

augroup mygroup
  autocmd!
  " Setup formatexpr specified filetype(s).
  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  " Update signature help on jump placeholder.
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" Applying codeAction to the selected region.
" Example: `<leader>aap` for current paragraph
xmap <leader>a  <Plug>(coc-codeaction-selected)
nmap <leader>a  <Plug>(coc-codeaction-selected)

" Remap keys for applying codeAction to the current buffer.
nmap <leader>ac  <Plug>(coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap <leader>qf  <Plug>(coc-fix-current)

" Run the Code Lens action on the current line.
nmap <leader>cl  <Plug>(coc-codelens-action)

" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)

" Remap <C-f> and <C-b> for scroll float windows/popups.
if has('nvim-0.4.0') || has('patch-8.2.0750')
  nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
  nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
  inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
  inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
  vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
  vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
endif

" Use CTRL-S for selections ranges.
" Requires 'textDocument/selectionRange' support of language server.
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(coc-range-select)

" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocActionAsync('format')

" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call     CocAction('fold', <f-args>)

" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR   :call     CocActionAsync('runCommand', 'editor.action.organizeImport')

" Add (Neo)Vim's native statusline support.
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline.
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

" Mappings for CoCList
" Show all diagnostics.
nnoremap <silent><nowait> <space>a  :<C-u>CocList diagnostics<cr>
" Manage extensions.
nnoremap <silent><nowait> <space>e  :<C-u>CocList extensions<cr>
" Show commands.
nnoremap <silent><nowait> <space>c  :<C-u>CocList commands<cr>
" Find symbol of current document.
nnoremap <silent><nowait> <space>o  :<C-u>CocList outline<cr>
" Search workspace symbols.
nnoremap <silent><nowait> <space>s  :<C-u>CocList -I symbols<cr>
" Do default action for next item.
nnoremap <silent><nowait> <space>j  :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent><nowait> <space>k  :<C-u>CocPrev<CR>
" Resume latest coc list.
nnoremap <silent><nowait> <space>p  :<C-u>CocListResume<CR>


"___________airline___________
let g:airline#extensions#tabline#enable = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline#extensions#tabline#formatter = 'default'
let g:airline#extensions#ale#enabled = 1
let g:airline_theme = 'codedark'

"__________nerdcommmenter______
filetype plugin on
map <C-_> <leader>c<space>


"____________ale___________

let g:ale_disable_lsp = 1
let g:ale_linters = {'c': 'all'}
let g:ale_sign_column_always = 1

" ==
" == NERDTree-git
" ==
let g:NERDTreeIndicatorMapCustom = {
    \ "Modified"  : "✹",
    \ "Staged"    : "✚",
    \ "Untracked" : "✭",
    \ "Renamed"   : "➜",
    \ "Unmerged"  : "═",
    \ "Deleted"   : "✖",
    \ "Dirty"     : "✗",
    \ "Clean"     : "✔︎",
    \ "Unknown"   : "?"
    \ }


"____________fzf___________
map <C-p> :Files<CR>
map <C-b> :Buffers<CR>




